/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.uca.dss.curso2011.grupo5;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
import org.uca.dss.curso2011.grupo5.interfaz.InterfazListados;

/**
 *
 * @author Diego
 */
public class ListadoViajes implements InterfazListados {

    /**
     *
     * @param ltrayectos  lista de trayectos disponibles en la agencia.
     * @throws IllegalArgumentException
     */
    public ListadoViajes(List<Trayecto> ltrayectos) throws IllegalArgumentException
    {
        Args.comprobarNulo(ltrayectos);
        
        this.ltrayectos = ltrayectos;
    }

   /**
     * Permite obtener la hora de inicio del viaje. No se mostraran las
     * horas para las cuales ya no hay asientos disponibles
     *
     * @param origen ciudad origen
     * @param destino ciudad destino
     * @param fecha fecha del viaje
     * @return un array con las horas de partida disponibles
     * @throws IllegalArgumentException
     */
    public List<LocalTime> getHorarios(String origen, String destino, LocalDate fecha) throws IllegalArgumentException
    {
        Args.comprobarCadena(origen);
        Args.comprobarCadena(destino);
        Args.comprobarNulo(fecha);

        return listarViajes(origen,destino,fecha);
    }

   /**
     * Permite obtener la hora de inicio del viaje. No se mostraran las
     * horas para las cuales ya no hay asientos disponibles
     *
     * @param ciudadOrigen ciudad origen
     * @param ciudadDestino ciudad destino
     * @param fecha fecha del viaje
     * @return un array con las horas de partida disponibles
     * @throws IllegalArgumentException
     */
    private List<LocalTime> listarViajes(String ciudadOrigen, String ciudadDestino, LocalDate fecha) throws IllegalArgumentException
    {
        Args.comprobarCadena(ciudadOrigen);
        Args.comprobarCadena(ciudadDestino);
        Args.comprobarNulo(fecha);

       Viaje v = new Viaje(fecha, ciudadOrigen, ciudadDestino, ltrayectos);
       List<LocalTime> horasSalida = new ArrayList<LocalTime>();
       Iterator<Trayecto> trayectos = v.getTrayectos();

       while(trayectos.hasNext())
       {
           Trayecto t = trayectos.next();

           Iterator<HorarioTren> iteradorHorarios = t.getHorarios();
                
           while(iteradorHorarios.hasNext())
           {
               Horario h = iteradorHorarios.next();
               LocalTime hora = new LocalTime(h.getHoraSalida());

               int asientosReservados = v.reservasRealizadas(ciudadOrigen,ciudadDestino,fecha,hora);
               
               if((h.getNumAsientos() - asientosReservados) > 0)
               {
                   horasSalida.add(new LocalTime(h.getHoraSalida()));
               }
           }
       }
        
       return horasSalida;
    }

    private List<Trayecto> ltrayectos;
}
